Python读写yaml文件(使用PyYAML库) |
您所在的位置:网站首页 › 安装yaml模块 python › Python读写yaml文件(使用PyYAML库) |
一,YAML 简介
YAML,Yet Another Markup Language的简写,通常用来编写项目配置,也可用于数据存储,相比conf等配置文件要更简洁。 二,YAML 语法支持的数据类型: 字典、列表、字符串、布尔值、整数、浮点数、Null、时间等 基本语法规则: 1、大小写敏感 2、使用缩进表示层级关系 3、相同层级的元素左侧对齐 4、键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔 5、数组前加有 “-” 符号,符号与值之间需用空格分隔 6、None值可用null 和 ~ 表示 7、多组数据之间使用3横杠—分割 8、# 表示注释,但不能在一段代码的行末尾加 #注释,否则会报错 注意:网上查找到各种博客都提到yaml缩进时不能使用tab键,但我在pycharm编辑器里实际使用时是可以使用tab键进行缩进的,读写时并没有报错! 三,安装第三方yaml文件处理库PyYAMLpython没有自带的处理yaml文件的库,需要下载第三方库PyYAML 或 ruamel.yaml ,这里我们安装PyYAML。 pip install pyyaml # 下载速度慢的话加上清华镜像源 pip install pyyaml -i https://pypi.tuna.tsinghua.edu.cn/simple 四,读取yaml文件1,从yaml中读取字典 yaml中的字典格式如下: # yaml文件,文件名为yamlData os: Android osVersion: 10 account: username: xiaoqq password: 123456 deviceName: null appPackage: ~ bool1: True读取字典代码: import yaml with open('./yamlData.yml', 'r', encoding='utf-8') as f: result = yaml.load(f.read(), Loader=yaml.FullLoader) print(result, type(result)) print(result['os'], type(result['os'])) print(result['osVersion'], type(result['osVersion'])) print(result['account'], type(result['account'])) print(result['account']['username']) print(result['deviceName']) print(result['appPackage']) print(result['bool1'], type(result['bool1']))读取结果: {'os': 'Android', 'osVersion': 10, 'account': {'username': 'xiaoqq', 'password': 123456}, 'deviceName': None, 'appPackage': None} Android 10 {'username': 'xiaoqq', 'password': 123456} xiaoqq None None True从读取结果可以看出: 1,读取出来的数据不会改变原数据类型,即yaml里是什么数据类型,读出来就是什么类型。 2,Loader=yaml.FullLoader参数不写的话对结果不会有影响,但运行时会出现警告信息。 3,yaml.load(f.read(), Loader=yaml.FullLoader)也可以写成yaml.load(f, Loader=yaml.FullLoader),读取出来的结果相同。 2,从yaml中读取list yaml中list格式:数据前加’-’ 并使用空格与数据间隔开,如下: # yaml文件名yamlData - Android - 10 - null - ~ - True读取list代码: import yaml with open('./yamlData.yml', 'r', encoding='utf-8') as f: result = yaml.load(f.read(), Loader=yaml.FullLoader) print(result, type(result))读取结果: ['Android', 10, None, None, True]3,从yaml中读取元组 yaml中存储元组格式:yaml中使用!!对数据类型进行转换,yaml中tuple由list转换而来。如下: # yaml文件名yamlData !!python/tuple - Android - 10 - null - ~ - True读取元组代码: import yaml with open('./yamlData.yml', 'r', encoding='utf-8') as f: result = yaml.load(f.read(), Loader=yaml.FullLoader) print(result, type(result))读取结果: ('Android', 10, None, None, True)在实际使用中,很多的时候往往是多种类型嵌套的数据。如下yaml数据 # yaml文件名yamlData os: Android osVersion: 10 account: - username1: xiaoqq - password1: 123456 - username2: Lilei - password2: 888888 deviceName: null appPackage: ~ bool1: True读取结果: {'os': 'Android', 'osVersion': 10, 'account': [{'username1': 'xiaoqq'}, {'password1': 123456}, {'username2': 'Lilei'}, {'password2': 888888}], 'deviceName': None, 'appPackage': None, 'bool1': True}4,从yaml中读取多组数据 yaml多组数据时,每组数据之间需要用3横杠分隔’—’,如下: os: Android osVersion: 10 account1: username1: xiaoqq password1: 123456 --- os: ios osVersion: 12 account1: username2: Lilei password2: 888888从yaml中读取多组数据时需要使用yaml.load_all()方法,返回结果为一个生成器,需要使用for循环语句获取每组数据。代码如下: import yaml with open('./yamlData.yml', 'r', encoding='utf-8') as f: result = yaml.load_all(f.read(), Loader=yaml.FullLoader) print(result, type(result)) for i in result: print(i)读取结果: {'os': 'Android', 'osVersion': 10, 'account1': {'username1': 'xiaoqq', 'password1': 123456}} {'os': 'ios', 'osVersion': 12, 'account1': {'username2': 'Lilei', 'password2': 888888}} 五,写入yaml文件1,单组数据写入yaml文件 使用yaml.dump()方法,加入allow_unicode=True参数防止写入的中文乱码,如下: import yaml apiData = { "page": 1, "msg": "地址", "data": [{ "id": 1, "name": "学校" }, { "id": 2, "name": "公寓" }, { "id": 3, "name": "流动人口社区" }], } with open('./writeYamlData.yml', 'w', encoding='utf-8') as f: yaml.dump(data=apiData, stream=f, allow_unicode=True)写入结果: data: - id: 1 name: 学校 - id: 2 name: 公寓 - id: 3 name: 流动人口社区 msg: 地址 page: 12,多组数据写入yaml文件 使用yaml.dump_all()方法,如下: import yaml apiData1 = { "page": 1, "msg": "地址", "data": [{ "id": 1, "name": "学校" }, { "id": 2, "name": "公寓" }, { "id": 3, "name": "流动人口社区" }], } apiData2 = { "page": 2, "msg": "地址", "data": [{ "id": 1, "name": "酒店" }, { "id": 2, "name": "医院" }, { "id": 3, "name": "养老院" }], } with open('./writeYamlData.yml', 'w', encoding='utf-8') as f: yaml.dump_all(documents=[apiData1, apiData2], stream=f, allow_unicode=True)写入结果: data: - id: 1 name: 学校 - id: 2 name: 公寓 - id: 3 name: 流动人口社区 msg: 地址 page: 1 --- data: - id: 1 name: 酒店 - id: 2 name: 医院 - id: 3 name: 养老院 msg: 地址 page: 2在Python中除了PyYAML库之外,还有ruamel.yaml库也可以对yaml文件进行读写操作 如果对软件测试、接口测试、自动化测试、面试经验交流感兴趣可以加入我们。642830685,免费领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |